%%!TEX encoding = UTF-8 Unicode
%\pagestyle{headings}
\chapter{Obecný návrh}
\label{chap:plan}

\textit{API} (\textit{Application Programming Interface}) je běžné encyklopedické definice \cite{brit001} sada
standardizovaných požadavků, které umožňují vzájemnou komunikaci růz\-ných
počítačových systémů. API slouží přístupu k zařízením za účelem získávání dat nebo ovládání, a to standardizovaným
způsobem. Nemusí se přitom jednat o přímé připojení pomocí kabelu, stačí např. připojení pomocí \wifi{} sítě, jako u
robotického králíka \nab. API může být do velké míry nezávislé na konkrétním typu zařízení.

Tato kapitola obsahuje obecný popis návrhu API pro komunikaci s robotem v přirozeném jazyce. Kapitola
\ref{chap:implementation} představuje ukázkovou implementaci a její technické detaily.

\section{Vrstvový model API}

Koncepce vrstev je obecně aplikovatelný model, který umožňuje rozdělit složitý systém na jednodušší a obecnější
prvky. V ideálním případě by měly spolu komunikovat pouze sousední vrstvy a používat přitom výhradně veřejná rozhraní.
Asi nejznámější příkladem vrstvové architektury je model síťové komunikace ISO/OSI. V obchod\-ních aplikacích se
běžně používá třívrstvý model (prezentace, doména, zdroj dat) \cite{fowler}. 

Vrstvový model není populární jen v informatice, používá se také např. v~teoretické lingvistice. Jedné z lingvistických
teorií, které počítají s vrstvovým modelem -- funkčnímu generativnímu popisu -- je věnována část kapitoly \ref{fgd}.

V této práci jsme se rozhodli pro použití vrstvového modelu API. V~tabulce \ref{tab:layers_01} se nachází stručný
přehled použitých vrstev. Jejich přesnější popis následuje v dalších podkapitolách.

\newcommand{\secondlayername}{Interpretační vrstva}
\newcommand{\thirdlayername}{Vrstva po\-ro\-zu\-mění ja\-zyku}
\newcommand{\layercolwidth}{5.2cm}
\begin{table}[!ht]
\begin{tabular}{|m{\layercolwidth}|m{2.7cm}|m{\layercolwidth}|}\hline
Vstup (uživatel $\rightarrow$ zařízení) & \centering Komponenta & Výstup
(zařízení $\rightarrow$ uživatel) \\
\hline\hline
Přímé ovládání zařízení. &
\centering\textbf{Fyzická vrstva} &
Vygenerování události. \\
\hline

Interpretace zpráv v~me\-zi\-ja\-zy\-ce a volání kon\-krét\-ních me\-tod fyzické
vrstvy. &
\centering\textbf{\secondlayername} &
Reakce na události a vy\-tvá\-ře\-ní parametrizovaných zpráv v
mezijazyce na jejich základě.\\
\hline

\textit{Porozumění} zprávě v při\-ro\-ze\-ném jazyce (rozpoznání mlu\-vené řeči
nebo par\-so\-vání textu a vytvoření
odpovídající zprávy v mezijazyce). &
\centering\textbf{\thirdlayername} & Vytvoření textové nebo zvu\-ko\-vé zprávy
v~při\-ro\-ze\-ném jazyce na základě pa\-ra\-me\-tri\-zo\-vané zprávy
v~mezijazyce. \\
\hline

Příjem uživatelského vstupu (typicky se jedná o textové nebo zvukové zprávy). &
\centering\textbf{Uživatelské rozhraní} &
Zobrazení nebo přehrání zprávy v~při\-ro\-ze\-ném jazyce uživateli.\\
\hline
\end{tabular}
\caption{Přehled vrstvového modelu API pro ovládání robota v přirozeném jazyce.}
\label{tab:layers_01}
\end{table}

\subsection*{Popis jednotlivých vrstev}

\subsubsection*{Fyzická vrstva}

Tato vrstva zajišťuje nízkoúrovňovou komunikaci s ovládaným zařízením. Kon\-k\-rétní implementace (např. používaný
protokol) je pro ostatní vrstvy skrytá. Komponenty, které jsou součástí jiných vrstev, můžou přistu\-po\-vat k fyzické
vrstvě pouze pomocí abstraktního rozhraní, které je závislé na konkrétním ovlá\-da\-ném zařízení, nikoli ale na
implementačních detailech ovladačů. Toto rozhraní poskytuje metody pro ovládání zařízení a
umožňuje reagovat na nastalé události.\footnote{Programovací jazyk \java, ve kterém jsme
provedli konkrétní implementaci
API, nemá přímou podporu pro odchytávání událostí. Místo nich používáme návrhový
vzor
\textit{Observer} \cite{pecinovsky001}.} V~ide\-álním případě nemusí být programátorům,
kteří pracují na ostatních vrstvách, o~kon\-krétní im\-ple\-men\-taci ovládání robota nic známo.\footnote{V praxi je
bohužel tento požadavek splněn málokdy.
Programátor musí např. vě\-dět, zda se pro ovládání zařízení používá síťový
přenos dat (což je případ robota \nab),
jestli by příkazy měly být seskupovány do větších balíků atp.}

\subsubsection*{\secondlayername}

Na této vrstvě dochází k \textit{interpretaci} příkazů/zpráv v mezijazyce (viz \ref{chap:proj:intlang}), tj. k volání metod
rozhraní poskytovaného fyzickou vrstvou na základě zpráv v mezijazyce. Interpretační vrstva dále odpovídá
za vytváření zpráv v mezijazyce\footnote{Obecné generování zpráv na základě
sémantické reprezentace je velmi
komplikovaný problém. I kdyby se podařilo vyřešit ho pro některé jazyky, lokalizace
softwaru do dalších jazykových
prostředí by vyžadovala obrovské množství práce. Z těchto důvodů řešíme
generování zpráv na této úrovni následujícím
způsobem: k dispozici máme indexované slovníky vzorců pro generování textových
zpráv (podrobnosti viz kapitola
\ref{sec:nlpat} na stránce \pageref{sec:nlpat}). Místo aby zpráva byla
generována v mezijazyce, komponenta vybírá index
vzorce a určuje parametry. Pro lokalizaci takto vzniklých hlášek stačí přeložit lokalizační slovník do cílového jazyka.}
na základě
událostí generovaných fyzickou vrstvou.

Interpretační vrstva je obecnější než fyzická vrstva, nejedná se ale o zcela komponentu nezávislou na ovládaném
zařízení. Lze ji sdílet napříč zařízeními, které poskytují podobnou funkcionalitu a
tím pádem zpřístupňují stejná (nebo
podobná) rozhraní. Může se jednat např. o autorádia, GPS navigace nebo
internetové prohlížeče.

\subsubsection*{\thirdlayername}

V této vrstvě dochází ke konverzi mezi uživatelským vstupem v přirozeném jazyce (textem nebou mluvenou řečí) a
univerzálním mezijazykem. Součástí této vrstvy by mělo být:
\begin{itemize}
  \item porozumění psanému textu (parsování a interpretace) -- konverze text
$\rightarrow$ mezijazyk
  \item rozpoznání mluvené řeči -- konverze zvuk $\rightarrow$ mezijazyk
  \item vygenerování zprávy v přirozeném jazyce -- konverze mezijazyk
$\rightarrow$ text nebo řeč
\end{itemize}
Zpráva se po konverzi do mezijazyka předává interpretační vrstvě. Teoreticky
by vrstva porozumění jazyku mohla být
nezá\-vislá na ovládaném zařízení. Nicméně kvůli komplikovanosti zpracování
zejména zvukových zpráv v při\-ro\-ze\-ném
jazyce ji lze sdílet jen v rámci společné jazykové domény a měla by mít
přístup ke kontextu.

\subsubsection*{Uživatelské rozhraní}

Tato vrstva zajišťuje přímou komunikaci s uživatelem, především textový a/nebo
zvukový vstup a výstup. Uživatelský vstup
se dále předává interpretační vrstvě. Vrstva uživatelského rozhraní je obecná a
nezávislá na ovlá\-da\-ném zařízení -- odvíjí se pouze od způsobu zadávání příkazů uživatelem.\footnote{Je nicméně
možné, že vstupní nebo výstupní zařízení
bude součástí ovládaného robota (např. do výbavy robota {\nab} patří mikrofon,
pomocí kterého lze zaznamenávat
uživatelský vstup, a reproduktory, na které lze poslat výstup). V tomto případě
musí vrstva uživatelského rozhraní
volat metody z fyzické vrstvy.}. Součástí této vrstvy může být i generování
řeči z psaného textu. Volitelné dodatečné součásti této vrstvy zahrnují např.:
\begin{itemize}
  \item konzola nebo grafický prvek uživatelského rozhraní, který umožňuje
zadání textového vstupu a zobrazení textového
  výstupu
  \item komponenty pro pořizování zvukového záznamu pomocí mik\-rofonu
počítače nebo ovládaného zařízení
  \item ovladače reproduktorů počítače nebo robota
\end{itemize}

\section{Mezijazyk}
\label{chap:proj:intlang}

Implementaci API, které umožňuje ovládání robota v přirozeném jazyce, výz\-namně
zjednodušuje použití sémantického popisu, jenž vychází z koncepce tektogramatické roviny a funkčního
generativního popisu \cite{hajicova001}. Pro potřeby této práce specifikujeme \textit{mezijazyk} -- zjednodušenou obdobu
tektogramatické roviny. Mezijazyk stojí
na výstupu všech komponent API, které slouží porozumění textu a rozpoznávání řeči (vrstva
porozumění jazyku). V této kapitole
popíšeme rozčlenění jazyka do rovin ve funkčním generativním popisu i návrh našeho mezijazyka.

\subsection*{Funkční generativní popis}
\label{fgd}

Funkční generativní popis (FGP) je teoretický model jazyka založený na závislostním formalismu.

Základem FGP je rozčlenění popisu přirozeného jazyka do čtyř
rovin \cite{hajicova001}.\footnote{Starší verze FGP pracovaly dokonce s pěti rovinami (roviny fonetická a~morfonologická
byly sloučeny do~spo\-lečné fonologické roviny).} Sousední roviny stojí ve vzájemném vztahu formy a funkce (nižší rovina
je formou vyšší roviny, kdežto vyšší rovina je funkcí roviny nižší).

\begin{description}
\item[Tektogramatická rovina] reprezentuje hloubkový význam sdělení a neobsahuje
idiomy a řeší nejednoznačnosti. Je společná pro všechny přirozené ja\-zyky.

V této rovině bude mít např. české sdělení \textit{jedu do Kolína} různé reprezentace v~závislosti na tom, zda se jedná
o Kolín ve Středočeském kraji nebo Kolín nad Rýnem.
\item[Rovina povrchové syntaxe] zachycuje formální strukturu věty (podmět,
pří\-su\-dek, valenční rámec, volná doplnění).
Na rozdíl od tektogramatické roviny je závislá na konkrétním jazyce a
nerozlišuje význam slov (může tím pádem obsahovat
víceznačnosti).

V rovině povrchové syntaxe má sdělení \textit{jedu do Kolína} stejnou
reprezentaci nezávisle na přesném cíli cesty.
\item[Morfematická rovina] popisuje morfémy\footnote{Morfém je nejmenší jazykový jednotka nesoucí význam.}, ze kterých
se skládá věta. Mezi mor\-fémy patří:
\begin{itemize}
  \item lexikální morfémy (kmeny slov),
  \item gramatické morfémy (pádové a slovesné koncovky nebo např. gramatické
znaky v aglutinačních jazycích),
  \item odvozovací morfémy (předpony a přípony, které mění význam slova).
\end{itemize}
\item[Fonologická rovina] zachycuje sdělení jako posloupnost hlásek nebo
posloupnost fonémů.

Hláska je základní řečová jednotka z hlediska fonetiky. Jedná se o množinu velmi
podobných zvuků vyslovených člověkem.
Např. \textit{n} ve slově \textit{ne} a \textit{n} ve~slově \textit{banka} jsou
dvě různé hlásky (\texttt{[n]} a
\texttt{[ng]}).

Foném je jednotka vyšší úrovně než hláska, je to minimální zvuková jednotka rozlišující zvuk. Jedná se o množinu tzv.
alofonů -- různých hlásek, které neovlivňují význam.
Např. \texttt{[n]} a \texttt{[ng]} nejsou v~českém jazyce odlišné fonémy.
\end{description}
% TODO

\subsection*{Implementace mezijazyka}
Vyjádření v mezijazyce jsou implementována jako stromová struktura s jasně určeným kořenem. Vše\-chna
vyjádření mají určený kořen. Každý uzel mezijazyka je trojice (slovo, atributy, potomci), podrobnější vysvětlení se
nachází v tabulce \ref{tab:il_node_01}. Přesná struktura
(sada používaných slov a atributů,
způsob přiřazení potomků rodičům) je závislá na konkrétní implementační vrstvě.
V tabulce \ref{tab:il_example_01} uvádíme příklady interpretace českých vět v ukázkové implementaci mezijazyka.

\begin{table}[pt]
\begin{tabular}{|m{2cm}|m{11.4cm}|}
\hline
Prvek &
Popis \\
\hline

\textit{lemma} &
Hlavní význam uzlu.
\\
\hline

\textit{atributy} &
Asociativní seznam klíč--hodnota. Jednotlivé atributy můžou mo\-di\-fi\-ko\-vat
význam \textit{slova} (mj. určit, zda se
jedná o příkaz nebo dotaz, přidat negaci atp.).
\\
\hline

\textit{potomci} &
Asociativní seznam klíč--uzel. Jednotliví potomci představují parametry
\textit{lemmatu} (naplnění valenčního rámce, příslovečná určení atp.).
\\
\hline
\end{tabular}
\caption{Popis uzlu vyjádření v mezijazyce.}
\label{tab:il_node_01}
\end{table}

\begin{table}[ht!]
\begin{tabular}{|m{4.3cm}|m{9cm}|}
\hline
Věta &
Interpretace \\ \hline

\textit{mávni levým uchem} &
\Tree  [.{\textbf{wave}\\$[$mood=imp$]$} [.{with\\\textbf{ear}\\$[$num=sg$]$}
[.{adj\\\textbf{left}\\$[$$]$} ] ] [.{subject\\\textbf{2}\\$[$num=sg$]$} ] ]
\\\hline
\textit{červeně rozsviť levé svě\-týlko na bříšku} &
\Tree  [.{\textbf{switch\_on}\\$[$mood=imp$]$}
[.{dir\_obj\\\textbf{led}\\$[$num=sg$]$} [.{adj\\\textbf{left}\\$[$$]$} ] ]
[.{free\\\textbf{belly}\\$[$num=sg$]$} ] [.{how\\\textbf{red}\\$[$$]$} ]
[.{subject\\\textbf{2}\\$[$num=sg$]$} ] ]
 \\ \hline
\end{tabular}
\caption{Příklady interpretace českých vět v mezijazyce. Z příkladů byly pro zvýšení
čitelnosti vynechány atributy,
které nehrají pro interpretační vrstvu roli.}
\label{tab:il_example_01}
\end{table}

\section{Základní datové typy}

Pro potřeby API byly vytvořeny dva datové typy, které umožňují reprezentaci
lingvistických objektů: textu v přirozeném
jazyce a zvukového záznamu řeči. Základní třídou je
\lstinline!cz.cuni.mff.ufal.volk.Expression! (vyjádření
v~při\-rozeném jazyce), od které dědí třídy:
\begin{itemize}
  \item \lstinline!cz.cuni.mff.ufal.volk.Text! -- texty v přirozeném jazyce,
  \item \lstinline!cz.cuni.mff.ufal.volk.Speech! -- záznam mluvené řeči.
\end{itemize}
Vlastnosti jednotlivých typů jsou popsány v tabulce \ref{tab:types_01} na
stránce \pageref{tab:types_01}.

\begin{table}[ht!]
\begin{threeparttable}[b]
\newcommand{\tdlw}{1.7cm}
\newcommand{\tdrw}{11.6cm}
\newcommand{\spacebt}{0.4cm}

\begin{tabular}{|m{\tdlw}|m{\tdrw}|}
\multicolumn{2}{c}{\lstinline!cz.cuni.mff.ufal.volk.Expression!} \\ \hline
Vlastnost & Popis \\ \hline
\lstinline!language! & Označení jazyka vyjádření podle normy ISO 639-1 nebo  ISO
639-2 (přednost
mají kratší kódy ISO~639-1). Tato vlastnost nemusí být nastavena (může být
\lstinline!null!), není-li jazyk vyjádření
znám.
\\
\hline
\end{tabular}

\vspace{\spacebt}
\begin{tabular}{|m{\tdlw}|m{\tdrw}|}
\multicolumn{2}{c}{\lstinline!cz.cuni.mff.ufal.volk.Text!}
\\ \hline
Vlastnost & Popis \\ \hline
\lstinline!text! & Znakový řetězec (\lstinline!String!) -- text v přirozeném
jazyce.
\\ \hline
\end{tabular}

\vspace{\spacebt}
\begin{tabular}{|m{\tdlw}|m{\tdrw}|}
\multicolumn{2}{c}{\lstinline!cz.cuni.mff.ufal.volk.Speech!}
\\ \hline
Vlastnost & Popis \\ \hline
\lstinline!format! & Název použitého formátu
uložení zvuku podle \url{http://sox.sourceforge.net/soxformat.html}, např.:
\begin{itemize}
  \item \textit{wav/signed-integer} -- nekó\-dovaný WAVE formát
  \item \textit{wav/oki-adpcm} -- WAVE for\-mát s~ADPCM2 kó\-do\-vá\-ním
  \item \textit{mp3}
\end{itemize}\\ \hline
\lstinline!data! & Binární data (pole bajtů) -- zvukový záznam v příslušném
formátu. Přesná specifikace záleží na
použitém formátu.
 \\ \hline
\end{tabular}
\caption{Základní popis vlastností datových typů pro reprezentaci
\textit{vyjádření} v~při\-rozeném jazyce (text,
záznam řeči). Vypsané vlastnosti slouží pouze pro čtení (v konkrétní implementaci v Javě přístupné pomocí metod
\lstinline!get!\ldots).}
\label{tab:types_01}
\end{threeparttable}
\end{table}

\section{Služby}

Pro řešení úloh, které nesouvisí přímo s ovládáním robota, nýbrž s obecnějším
zpracováním přirozeného jazyka, jsme navrhli sadu lingvistických rozhraní (\textit{interfaců} jazyka Java).
Tato rozhraní umožňují napojení jak
vlastních implementací, tak komponent třetích stran (včetně vzdálených systémů),
které řeší zadaný problém.
Všechna níže popsaná před\-definovaná rozhraní jsou součástí balíku
\lstinline!cz.cuni.mff.ufal.robot.services!.

\subsection*{Rozpoznávání jazyka}

Pro komponenty, které umožňují rozpoznávání jazyka textu nebo zvukového záznamu
(zatím pouze rozhraní, chybí konkrétní
implementace), jsou určena generická rozhraní \lstinline!LanguageRecognizer! a
\lstinline!LanguageRecognizerExtended!. V
níže uvedených ukázkách kódu \lstinline!T! je text v při\-ro\-ze\-ném jazyce
nebo záznam řeči (obecně libovolný typ
odvozený od \lstinline!Expression!).
%TODO <3 tutaj!
\begin{sourcecodedesc}
  \item[String recognize(T item)] Metoda je součástí obou zmíněných rozhraní.
Vrací kód (ISO 639-1\footnote{Norma ISO 639-1 určuje 136 dvoupísmenných zkratek
jazyků. Např. čeština je reprezentována kódem
\lstinline!cs! a angličtina -- \lstinline!en!.} nebo ISO
  639-2\footnote{Norma ISO 639-2 určuje 464 třípísmenných kódů jazyků (určuje
mj. kódy jazyků zohledněných v
normě ISO 639-1.). Např. češkému jazyku odpovídá v této normě kód
\lstinline!cze!, ang\-lickému -- \lstinline!eng!,
kašubštině -- \lstinline!csb! (kašubština nemá kód ISO 639-1).}) jazyka, který
je nejpravděpo\-dob\-nější pro vyjádření \lstinline!item!.
  \item[List<Hypothesis> recognize(T item, int max)] Metoda je zpřístupňována
rozhraním
  \lstinline!LanguageRecognizerExtended!. Vrací nejen kód nejprav\-dě\-po\-dobnějšího jazyka,
nýbrž až \lstinline!max! nejlepších hypotéz (kód jazyka a hodnocení).
\end{sourcecodedesc}

Součástí této práce je komponenta pro statistické rozpoznávání jazyka textu
(rozpoznávání jazyka zvukového záznamu
nebylo zatím implementováno) a konfigurační soubor (výsledek trénování), který
umožňuje rozpoznávání angličtiny,
češtiny, slovenštiny, polštiny a kašubštiny\footnote{Kašubština je jazyk nebo
nářečí polštiny (záleží na zdroji),
kterým mluví cca. 50~000 lidí, především na severu Polska.} (slovanské jazyky s
diakritikou nebo bez ní).

\subsection*{Generování řeči z psaného textu}

Generování řeči z psaného textu je možné pomocí komponent, které implementují
rozhraní \lstinline!TextToSpeech!.
Rozhraní zpřístupňuje následující metody:
\begin{sourcecodedesc}
  \item[List<String> availableVoices(String language)] Vrací seznam hlasů
podporovaných pro jazyk
  \lstinline!language!.
  \item[Speech process(Text text, String voice)] Generování řeči pomocí zadaného (parametr \lstinline!voice!) hlasu (jazyk by měl
  určovat parametr \lstinline!text!). Metoda vrátí zvukový záznam, který
odpovídá textu obsaženému v parametru
  \lstinline!text!. Formát výstupu záleží na použité komponentě.
\end{sourcecodedesc}

V této práci pro generování řeči z textů v českém jazyce používáme program
Epos\cite{epos001} (pomocí obálky
\lstinline!EposTextToSpeech!). Zvukový výstup je ve formátu WAVE.

\subsection*{Konverze zvukových formátů}

Komponenty, které poskytují možnost konverze mezi různými formáty zvu\-ko\-vých
záznamů, implementují rozhraní \lstinline!SpeechConverter!. Nejedná se o funkci, která je přímo spojena se
zpracováním přirozeného jazyka, nicméně často je konverze zvukového záznamu potřeba, aby
vyhověl požadavkům používaných komponent pro rozpoznávání řeči.

\begin{sourcecodedesc}
  \item[Speech convert(Speech input, String targetFormat)] Je to
nejdůleži\-tější metoda rozhraní, provádí
  konverzi zvukového záznamu do formátu urče\-ného pomocí parametru
\lstinline!targetFormat! (je-li daný pár formátů
  podporován).
  \item[List<String> sourceFormats()] Vrátí seznam všech zdrojových formátů.
  \item[List<String> outputFormats()] Vrátí seznam všech cílových formátů.
  \item[List<String> sourceFormats(String targetFormat)] Vrátí seznam těch
zdro\-jo\-vých for\-mátů, ze kterých je
  možná konverze do formátu \lstinline!targetFormat! (podporovány můžou být
konverze jen mezi některými páry
  zdrojových a cílových formátů).
  \item[List<String> outputFormats(String sourceFormat)] Vrátí seznam cílových
for\-mátů, do kterých je možná konverze
  z formátu \lstinline!sourceFormat!.
\end{sourcecodedesc}

V této práci pro změnu formátu používáme program SoX\cite{sox001} (pomocí obálky
\lstinline!SoxSpeechConverter!).

\section{Ovladač králíka \nab}

Ovladač umožňuje z programového kódu vyšších úrovní ovládání jednoho nebo více robotů sou\-časně. Nezávisí na externích
poskytovatelích služeb (např. na serverech výrobce), vyžaduje pouze přímé síťové spojení mezi roboty a počítačem, kde
běží ovladač. Zajišťuje obousměrnou komunikaci mezi robotickými králíky a počítačem. Může pomocí posluchačů
(návrhový vzor \textit{listener} \cite{pecinovsky001}) reagovat na následující události:
\begin{itemize}
 \item události, které králíci generují v pravidelných intervalech (pingy),
 \item zmáčknutí tlačítka uživatelem,
 \item nastavení pozic uší uživatelem,
 \item nahrání zvukového záznamu.
\end{itemize}

Pomocí ovladače je možné posílat králíkům příkazy a řídit tyto druhy chování:
\begin{itemize}
 \item rozsvícení světýlek,
 \item nastavení pozic uší,
 \item přehrání zvukového záznamu,
 \item přehrávání internetového rádia nebo jiného streamovaného zvuku v podporovaném formátu,
 \item přehrání choreografie.	
\end{itemize}

Ovladač funguje jako server, který s ovládanými zařízeními komunikuje pomocí bezstavového protokolu HTTP. Z toho
vyplývá omezení týkající se odesílání požadavků králíkům -- příkaz je možné odeslat pouze v odpovědi na HTTP
dotaz od robota.

Ovladač je thread-safe.\footnote{To znamená, že není potřeba synchronizovat vícevláknový přístup.} Musí se pouze
dbát na to, aby k volání jednotlivých metod docházelo ve správném stavu (např. nastavení ovladače lze měnit pouze před zapnutím nebo po
vypnutí (viz kapitola \ref{chap:implementation:volk} na stránce \pageref{chap:implementation:volk}).
